<?php
/**
 * file class file
 *
 * 用于文件夹内容的读取,复制,剪切等操作
 * @author tommy <streen003@gmail.com>
 * @copyright  Copyright (c) 2010 Tommy Software Studio
 * @link http://www.doitphp.com
 * @license New BSD License.{@link http://www.opensource.org/licenses/bsd-license.php}
 * @version $Id: file.class.php 1.3 2011-11-13 20:57:01Z tommy $
 * @package libraries
 * @since 1.0
 */

if (!defined('IN_DOIT')) {
    exit();
}

class file extends Base {

    /**
     * 分析文件夹是否存在
     *
     * @param string $dir_name 所要操作的文件目录名
     * @param boolean $is_mkdir 是否创建目录
     * @return string
     */
    protected static function parse_dir($dir_name, $is_mkdir = false) {

        //参数分析
        if (!$dir_name) {
            return false;
        }

        if ($is_mkdir === true) {
            if (is_dir($dir_name)) {
                if (!is_writable($dir_name)) {
                    chmod($dir_name, 0755);
                }
            } else {
                self::make_dir($dir_name, 0755);
            }
        } else {
            if (!is_dir($dir_name)) {
                Controller::halt('The dir:' . $dir_name . ' is not exists!');
            }
        }

        return $dir_name;
    }

    /**
     * 分析目标目录的读写权限
     *
     * @access public
     * @param string $dir_name    目标目录
     * @param string $mod 权限值
     * @return boolean
     */
    public static function make_dir($dir_name, $mode = 0755) {

        //参数分析
        if (!$dir_name) {
            return false;
        }

        if (is_dir($dir_name)) {
            return true;
        }
        mkdir($dir_name, $mode, true);

        return true;
    }

    /**
     * 获取目录内文件
     *
     * @param string $dir_name    所要读取内容的目录名
     * @return string
     */
    public static function read_dir($dir_name) {

        //参数分析
        if (!$dir_name) {
            return false;
        }

        $dir    = self::parse_dir($dir_name);

        $handle = opendir($dir);

        $files  = array();
        while (false !== ($file = readdir($handle))) {
            if ($file == '.' || $file == '..' || $file == '.cvs' || $file == '.svn') {
                continue;
            }
            $files[] = $file;
        }

        closedir($handle);

        return $files;
    }

    /**
     * 将一个文件夹内容复制到另一个文件夹
     *
     * @param string $source    被复制的文件夹名
     * @param string $dest        所要复制文件的目标文件夹
     * @return boolean
     */
    public static function copy_dir($source, $dest) {

        //参数分析
        if (!$source || !$dest) {
            return false;
        }

        $parse_dir = self::parse_dir($source);
        $dest_dir  = self::parse_dir($dest, true);

        $file_list = self::read_dir($parse_dir);

        foreach ($file_list as $file) {
            if (is_dir($parse_dir . '/' . $file)) {
                self::copy_dir($parse_dir . '/' . $file, $dest_dir . '/' . $file);
            } else {
                copy($parse_dir . '/' . $file, $dest_dir . '/' . $file);
            }
        }

        return true;
    }

    /**
     * 移动文件夹, 相当于WIN下的ctr+x(剪切操作)
     *
     * @param string $source    原目录名
     * @param string $dest        目标目录
     * @return boolean
     */
    public static function move_dir($source, $dest) {

        //参数分析
        if (!$source || !$dest) {
            return false;
        }

        $parse_dir = self::parse_dir($source);
        $dest_dir = self::parse_dir($dest, true);

        $file_list = self::read_dir($parse_dir);

        foreach ($file_list as $file) {
            if (is_dir($parse_dir . '/' . $file)) {
                self::move_dir($parse_dir . '/' . $file, $dest_dir . '/' . $file);
            } else {
                if (copy($parse_dir . '/' . $file, $dest_dir . '/' . $file)) {
                    unlink($parse_dir . '/' . $file);
                }
            }
        }

        rmdir($parse_dir);

        return true;
    }

    /**
     * 删除文件夹
     *
     * @param string $file_dir    所要删除文件的路径
     * @return boolean
     */
    public static function delete_dir($file_dir) {

        //参数分析
        if (!$file_dir){
            return false;
        }

        //清空子目录及内部文件
        self::clear_dir($file_dir);

        rmdir($parse_dir);

        return true;
    }

    /**
     * 清空文件夹内的文件及子目录
     *
     * @access public
     * @param string $dir_name 所要清空内容的文件夹名称
     * @param boolean $option 是否删除子目录, 注：当为false时,只删除子目录中的文件,目录不会删除
     * @return boolean
     */
    public static function clear_dir($dir_name, $option = true) {

        //参数分析
        if (!$dir_name){
            return false;
        }

        $parse_dir = self::parse_dir($dir_name);
        $file_list = self::read_dir($parse_dir);

        foreach ($file_list as $file) {
            if (is_dir($parse_dir . '/' . $file)) {
                self::delete_dir($parse_dir . '/' . $file);
                if ($option == true) {
                    rmdir($parse_dir . '/' . $file);
                }

            } else {
                unlink($parse_dir . '/' . $file);
            }
        }

        return true;
    }

    /**
     * 文件写操作
     *
     * @access public
     * @param string $file_name 文件路径
     * @param string $content 文件内容
     * @return boolean
     */
    public static function write_file($file_name, $content = '') {

        //参数分析
        if (!$file_name) {
            return false;
        }

        //分析文件目录
        self::parse_dir(dirname($file_name), true);

        return file_put_contents($file_name, $content, LOCK_EX);
    }

    /**
     * 文件复制
     *
     * @access public
     * @param string $source_file 源文件(被复制的文件)
     * @param string $dest_file 所要复制的文件
     * @return boolean
     */
    public static function copy_file($source_file, $dest_file) {

        //参数分析
        if (!$source_file || !$dest_file) {
            return false;
        }

        //文件及目录分析
        if (!is_file($source_file)) {
            Controller::halt('The file:' . $source_file . ' is not exists!');
        }
        self::parse_dir(dirname($dest_file), true);

        return copy($source_file, $dest_file);
    }

    /**
     * 文件重命名或移动文件
     *
     * @access public
     * @param string $source_file 源文件
     * @param string $dest_file 新文件名或路径
     * @return boolean
     */
    public static function move_file($source_file, $dest_file) {

        //参数分析
        if (!$source_file || !$dest_file) {
            return false;
        }

        //文件及目录分析
        if (!is_file($source_file)) {
            Controller::halt('The file:' . $source_file . ' is not exists!');
        }
        self::parse_dir(dirname($dest_file), true);

        return rename($source_file, $dest_file);
    }

    /**
     * 删除文件
     *
     * @access public
     * @param string $file_name 文件路径
     * @return boolean
     */
    public static function delete_file($file_name) {

        //参数分析
        if (!$file_name) {
            return false;
        }

        //文件分析
        if (!is_file($file_name)) {
            return true;
        }

        return unlink($file_name);
    }

    /**
     * 字节格式化 把字节数格式为 B K M G T 描述的大小
     *
     * @access public
     * @param integer $bytes 文件大小
     * @param integer $dec 小数点后的位数
     * @return string
     */
    public static function format_bytes($bytes, $dec = 2) {

        $unitPow = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
        $pos = 0;
        while ($bytes >= 1024) {
             $bytes /= 1024;
             $pos++;
        }

        return round($bytes, $dec) . ' ' . $unitPow[$pos];
    }
}